Fix control channel reconnect after xend restart.
def consoles(self):
return daemon.get_consoles()
- def console_create(self, dom, console_port=None):
- consinfo = daemon.console_create(dom, console_port=console_port)
+ def console_create(self, dom, console_port=None, remote_port=0):
+ consinfo = daemon.console_create(dom, console_port=console_port,
+ remote_port=remote_port)
return consinfo
def console_get(self, id):
if self.console:
self.console.registerChannel()
else:
- self.console = xendConsole.console_create(self.dom, console_port=self.console_port)
+ self.console = xendConsole.console_create(
+ self.dom, console_port=self.console_port, remote_port=1)
self.build_domain(ostype, kernel, ramdisk, cmdline)
self.image = kernel
self.ramdisk = ramdisk
def netif_get(self, dom):
return self.netifCF.getControllerByDom(dom)
- def console_create(self, dom, console_port=None):
+ def console_create(self, dom, console_port=None, remote_port=0):
"""Create a console for a domain.
"""
console = self.consoleCF.getControllerByDom(dom)
if console is None:
- console = self.consoleCF.createController(dom, console_port)
+ console = self.consoleCF.createController(dom, console_port,
+ remote_port=remote_port)
return console
def consoles(self):
del self.channels[idx]
self.notifier.unbind(idx)
- def domChannel(self, dom):
+ def domChannel(self, dom, remote_port=0):
"""Get the channel for the given domain.
Construct if necessary.
"""
chan = self.getDomChannel(dom)
if not chan:
- chan = Channel(self, dom)
+ chan = Channel(self, dom, remote_port=remote_port)
self.addChannel(chan)
return chan
"""
self.delChannel(channel.idx)
- def createPort(self, dom):
+ def createPort(self, dom, remote_port=0):
"""Create a port for a channel to the given domain.
"""
- return xu.port(dom)
+ return xu.port(dom, remote_port)
def channelFactory():
"""Singleton constructor for the channel factory.
are multiplexed over the channel (console, block devs, net devs).
"""
- def __init__(self, factory, dom):
+ def __init__(self, factory, dom, remote_port=0):
"""Create a channel to the given domain using the given factory.
Do not call directly, use domChannel on the factory.
# Domain.
self.dom = int(dom)
# Domain port (object).
- self.port = self.factory.createPort(dom)
+ self.port = self.factory.createPort(dom, remote_port=remote_port)
# Channel port (int).
self.idx = self.port.local_port
# Registered devices.
"""Factory for creating console controllers.
"""
- def createController(self, dom, console_port=None):
+ def createController(self, dom, console_port=None, remote_port=0):
if console_port is None:
console_port = CONSOLE_PORT_BASE + dom
for c in self.getControllers():
if c.console_port == console_port:
raise XendError('console port in use: ' + str(console_port))
- console = ConsoleController(self, dom, console_port)
+ console = ConsoleController(self, dom, console_port,
+ remote_port=remote_port)
self.addController(console)
log.info("Created console id=%s domain=%d port=%d",
console.idx, console.dom, console.console_port)
STATUS_CONNECTED = 'connected'
STATUS_LISTENING = 'listening'
- def __init__(self, factory, dom, console_port):
- controller.Controller.__init__(self, factory, dom)
+ def __init__(self, factory, dom, console_port, remote_port=0):
+ controller.Controller.__init__(self, factory, dom,
+ remote_port=remote_port)
self.addMethod(CMSG_CONSOLE, 0, None)
self.status = self.STATUS_NEW
self.addr = None
@type responders: {int:Responder}
"""
- def __init__(self):
+ def __init__(self, remote_port = 0):
self.channelFactory = channel.channelFactory()
self.majorTypes = {}
self.dom = None
self.idx = None
self.responders = {}
self.timeout = 10
+ self.remote_port = remote_port
def setTimeout(self, timeout):
self.timeout = timeout
channel to our domain. Once we have registered, the channel
will call requestReceived or responseReceived for our messages.
"""
- self.channel = self.channelFactory.domChannel(self.dom)
+ self.channel = self.channelFactory.domChannel(self.dom,
+ self.remote_port)
self.idx = self.channel.getIndex()
if self.majorTypes:
self.channel.registerDevice(self.getMajorTypes(), self)
@type idx: String
"""
- def __init__(self, factory, dom):
- CtrlMsgRcvr.__init__(self)
+ def __init__(self, factory, dom, remote_port=0):
+ CtrlMsgRcvr.__init__(self, remote_port=remote_port)
self.factory = factory
self.dom = int(dom)
self.channel = None